package com.atguigu.lease.admin.controller.system;

import com.atguigu.lease.admin.interceptor.WebAdminAuthInterceptor;
import com.atguigu.lease.admin.service.SystemLoginService;
import com.atguigu.lease.common.util.JwtUtil;
import com.atguigu.lease.model.dto.LoginSubmitDto;
import com.atguigu.lease.model.result.Response;
import com.atguigu.lease.model.vo.CaptchaVo;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@Tag(name = "管理员登录模块")
@RestController
@RequestMapping("/admin")
public class SystemLoginController {
    @Autowired
    SystemLoginService systemLoginService;
    /*
        以后项目 大量的接口必须登录以后才可以访问

        如果在这些接口中 都编写 token校验逻辑 代码冗余

        我们可以在 这些接口访问前 统一校验登录状态

        > 不需要校验登录的接口：
            获取验证码接口
            登录接口
            swagger接口：
        > 所有的CRUD的接口：
            都需要校验登录状态

         校验登录状态：
            方式1： aop动态代理      比较麻烦( 方法没有统一的命名规范、 自定义注解 基本所有的接口都需要添加  所以切入点表达式编写繁琐)
                    可以编写前置通知 再目标接口方法访问前 判断登录状态

            方式2： springmvc拦截器
                    可以根据路径表达式 拦截 或者放行
                    可以在handler方法执行前拦截请求
     */
    @Operation(summary = "3、登录成功获取个人信息")
    @GetMapping("info")
    public Response inf(){
        //获取拦截器透传的数据使用
        return Response.ok(WebAdminAuthInterceptor.THREAD_LOCAL.get());
    }
//    public Response<Map<String,Object>> info(@RequestHeader("ACCESS_TOKEN") String token) {
//        String secretKey = "1234567890qazwsxedcrfvtgbyhnujmik2213wrewrw4234234235werwrewtesdfsfsfsafsdfdsafsa";
//
//        Claims claims = (Claims) Jwts.parser()
//                .setSigningKey(secretKey)
//                .parse(token)
//                .getBody();
//
//        String username = claims.get("username", String.class);
//        String avatarUrl = claims.get("avatarUrl", String.class);
//
//        Map<String,String> map = new HashMap<>();
//        map.put("name",username);
//        map.put("avatarUrl",avatarUrl);
//        return Response.ok(JwtUtil.parseJwt(token));

//    }
    @Operation(summary = "2、登录接口返回jwt")
    @PostMapping("/login")
    public Response<String> login(@Validated @RequestBody LoginSubmitDto loginSubmitDto,
                                  BindingResult bindingResult) {
        //@Validated 启用参数校验
        //BindingResult 接受校验结果
        if(bindingResult.hasErrors()){
            throw new RuntimeException(bindingResult.getFieldError()
                    .getDefaultMessage());
        }


        String jwt = systemLoginService.login(loginSubmitDto);
        return Response.ok(jwt);
    }

    @Operation(summary = "1、获取登录验证码接口")
    @GetMapping("/login/captcha")
    public Response<CaptchaVo> getCaptcha(){
        //生成验证码，保存验证码的 值到redis中缓存
        CaptchaVo vo = systemLoginService.getCaptcha();
        return Response.ok(vo);
    }
}
